iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

上一篇提到了預設變數,然而預設變數不能作任何更動與設定,如果想自己定義變數用於報表中,就要自行設定變數的屬性。

新增變數

來新增一個變數,認識變數的屬性吧

  • 先到左下區域在「Variables」點右鍵 -> Create Variable
  • 選取這個新增的變數,可以在右下屬性區域查看有哪些可以設定的屬性,如果是預設變數就看不到了

先介紹一些常用的屬性:

Expression

表達式通常可以放入要對哪個Field作為變數計算的資料。

Calculation

Calculation是對報表數據進行計算的方式,有許多不同的計算類型,如下表:

Calculation 功能
Sum 累計某個數字欄位的總和
Count 計算資料出現的次數
Distinct Count 計算不重複的資料筆數
Average 計算數值欄位的平均值
Lowest 取得資料欄位中的最小值
Highest 取得資料欄位中的最大值
Standard Deviation 計算數值欄位的標準差
Variance 計算數值欄位的變異數
System 變數值由系統提供,一般用來記錄像是頁碼、時間戳等資訊
First 變數會保留資料集中第一個出現的值

Increment Type & Reset Type

  • Increment Type: 定義變數的值應該被重新計算的範圍
  • Reset Type: 定義變數的值重設為初始值的範圍

這些屬性要如何應用在報表上呢?

情境:學生考試成績表

來實際操作一次,這次我想將學生修的課程分組,以變數顯示每個課程的學生最高成績。

設計報表模板

  1. 依據DB先設計好有哪些欄位,新增所需的Fields,DB關聯圖如下:
  2. 以courseDesc(課程)這個Field為分組依據,產生Group Header與Group Footer
    報表會顯示這些欄位:

    這裡就先簡單帶過,詳細步驟可以看前面的發文唷

新增自訂變數

新增一個變數,取名highestScore,將Text Field以"課程最高成績:" + $V{highestScore}表達式放到Group Footer中,此時模板已經完成:

設定變數屬性

我們目的是顯示每個課程的學生最高成績,因此

  • Calculation:設定為「Highest」,以取得最高數值
  • Expression:點選Expression右邊的icon -> 在「score」點兩下,表達式顯示為$F{score},表示此變數會以「score」的數值來計算
  • Increment Type:選擇None
  • Reset Type:選擇Group(這是新增Group之後會自動出現的屬性),表示每個Group結束後數值重置

SQL查詢資料

因為要用課程分組,SQL要以courseDesc為第一順位排序。

@Override
public List<StudentCourseScoreDto> getStudentCourseScoreData() {
    QStudentEntity qStudent = QStudentEntity.studentEntity;
    QDepartmentEntity qDepartment = QDepartmentEntity.departmentEntity;
    QCourseEntity qCourse = QCourseEntity.courseEntity;
    QScoreEntity qScore = QScoreEntity.scoreEntity;

    return queryFactory.select(Projections.bean(StudentCourseScoreDto.class,
            qStudent.studentId, qStudent.firstName, qStudent.lastName, 
            qStudent.gender, qStudent.grade, qDepartment.departmentId,
            qDepartment.departmentName, qDepartment.departmentDesc,
            qCourse.courseId, qCourse.courseName, qCourse.courseDesc, 
            qCourse.credit, qScore.scoreId, qScore.score, qScore.testDate))
        .from(qStudent)
        .innerJoin(qDepartment)
            .on(qStudent.departmentId.eq(qDepartment.departmentId))
        .innerJoin(qScore)
            .on(qStudent.studentId.eq(qScore.studentId))
        .innerJoin(qCourse)
            .on(qScore.courseId.eq(qCourse.courseId))
        .orderBy(qCourse.courseDesc.asc(), 
            qStudent.grade.asc(), qStudent.studentId.asc())
        .fetch();
}

匯出PDF

最後可以看到在每個組別的Footer,都會顯示該課程中學生考試的最高成績囉


Reference


上一篇
JasperReports-為報表加上頁碼
下一篇
JasperReports-匯出多個sheet的Excel
系列文
Java工程師的報表入門與實作15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言